﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Blank.CommonLib.Encrypt
{
    public class MD5Util
    {
        public static readonly byte[] Iv = { 102, 16, 93, 156, 78, 44, 218, 32 };//定义偏移量   
        public static readonly byte[] Key = { 155, 103, 246, 79, 36, 99, 167, 33 };//定义密钥   
        #region MD5加密
        /// <summary>   
        /// MD5加密   
        /// </summary>   
        /// <param name="strSource">需要加密的字符串</param>   
        /// <returns>MD5加密后的字符串</returns>   
        public static string Md5Encrypt(string strSource)
        {
            //把字符串放到byte数组中   
            byte[] bytIn = System.Text.Encoding.Default.GetBytes(strSource);
            //实例DES加密类   
            DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider();
            mobjCryptoService.Key = Iv;
            mobjCryptoService.IV = Key;
            using (ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor())
            {
                //实例MemoryStream流加密密文件   
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write))
                    {
                        cs.Write(bytIn, 0, bytIn.Length);
                        cs.FlushFinalBlock();
                        return System.Convert.ToBase64String(ms.ToArray());
                    }
                }
            }
        }
        #endregion
        #region MD5解密
        /// <summary>   
        /// MD5解密   
        /// </summary>   
        /// <param name="Source">需要解密的字符串</param>   
        /// <returns>MD5解密后的字符串</returns>   
        public static string Md5Decrypt(string Source)
        {
            //将解密字符串转换成字节数组   
            byte[] bytIn = System.Convert.FromBase64String(Source);
            //给出解密的密钥和偏移量，密钥和偏移量必须与加密时的密钥和偏移量相同   
            DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider();
            mobjCryptoService.Key = Iv;
            mobjCryptoService.IV = Key;
            //实例流进行解密   
            System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
            StreamReader strd = new StreamReader(cs, Encoding.Default);
            return strd.ReadToEnd();
        }
        #endregion
        /// <summary>    
        /// 获得32位的MD5加密    
        /// </summary>    
        public static string GetMD5_32(string input) { return ""; }
        /// <summary>    
        /// 获得16位的MD5加密    
        /// </summary>    
        public static string GetMD5_16(string input) { return ""; }
        /// <summary>    
        /// 获得8位的MD5加密    
        /// </summary>    
        public static string GetMD5_8(string input) { return ""; }
        /// <summary>    
        /// 获得4位的MD5加密    
        /// </summary>    
        public static string GetMD5_4(string input) { return ""; }
        /// <summary>    
        /// 添加MD5的前缀，便于检查有无篡改    
        /// </summary>    
        public static string AddMD5Profix(string input) { return ""; }
        /// <summary>    
        /// 移除MD5的前缀    
        /// </summary>    
        public static string RemoveMD5Profix(string input) { return ""; }
        /// <summary>    
        /// 验证MD5前缀处理的字符串有无被篡改    
        /// </summary>    
        public static bool ValidateValue(string input) { return false; }
        #region MD5签名验证
        /// <summary>    
        /// 对给定文件路径的文件加上标签    
        /// </summary>    
        /// <param name="path">要加密的文件的路径</param>    
        /// <returns>标签的值</returns>    
        public static bool AddMD5(string path) { return false; }
        /// <summary>    
        /// 对给定路径的文件进行验证，如果一致返回True，否则返回False    
        /// </summary>    
        /// <param name="path"></param>    
        /// <returns>是否加了标签或是否标签值与内容值一致</returns>    
        public static bool CheckMD5(string path) { return false; }
        #endregion
    }
}
